package org.convallaria.system.biz.service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 风险用户检测服务接口
 * 提供用户行为分析和风险评估功能
 * 
 * @author convallaria
 * @since 1.0.0
 */
public interface RiskDetectionService {

    /**
     * 分析用户行为风险
     * 
     * @param userId 用户ID
     * @return 风险分析结果
     */
    Map<String, Object> analyzeUserRisk(Long userId);

    /**
     * 检测异常登录行为
     * 
     * @param userId 用户ID
     * @param ip IP地址
     * @param userAgent 用户代理
     * @param loginTime 登录时间
     * @return 异常检测结果
     */
    Map<String, Object> detectAbnormalLogin(Long userId, String ip, String userAgent, LocalDateTime loginTime);

    /**
     * 检测异常操作行为
     * 
     * @param userId 用户ID
     * @param operation 操作类型
     * @param resource 操作资源
     * @param timestamp 操作时间
     * @return 异常检测结果
     */
    Map<String, Object> detectAbnormalOperation(Long userId, String operation, String resource, LocalDateTime timestamp);

    /**
     * 获取用户风险等级
     * 
     * @param userId 用户ID
     * @return 风险等级 (LOW, MEDIUM, HIGH, CRITICAL)
     */
    String getUserRiskLevel(Long userId);

    /**
     * 获取高风险用户列表
     * 
     * @param limit 限制数量
     * @return 高风险用户列表
     */
    List<Map<String, Object>> getHighRiskUsers(int limit);

    /**
     * 更新用户风险评分
     * 
     * @param userId 用户ID
     * @param riskScore 风险评分 (0-100)
     * @param reason 评分原因
     */
    void updateUserRiskScore(Long userId, int riskScore, String reason);

    /**
     * 获取用户行为模式
     * 
     * @param userId 用户ID
     * @return 行为模式分析
     */
    Map<String, Object> getUserBehaviorPattern(Long userId);

    /**
     * 检测批量操作风险
     * 
     * @param userId 用户ID
     * @param operationCount 操作次数
     * @param timeWindow 时间窗口（分钟）
     * @return 批量操作风险检测结果
     */
    Map<String, Object> detectBatchOperationRisk(Long userId, int operationCount, int timeWindow);

    /**
     * 检测权限滥用风险
     * 
     * @param userId 用户ID
     * @param permissions 权限列表
     * @return 权限滥用风险检测结果
     */
    Map<String, Object> detectPermissionAbuseRisk(Long userId, List<String> permissions);

    /**
     * 获取风险检测配置
     * 
     * @return 风险检测配置
     */
    Map<String, Object> getRiskDetectionConfig();

    /**
     * 更新风险检测配置
     * 
     * @param config 风险检测配置
     */
    void updateRiskDetectionConfig(Map<String, Object> config);

    /**
     * 生成风险报告
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 风险报告
     */
    Map<String, Object> generateRiskReport(Long userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取系统风险概览
     * 
     * @return 系统风险概览
     */
    Map<String, Object> getSystemRiskOverview();
}
